package com.fly.common;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.SystemUtils;
import org.junit.jupiter.api.Test;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ImagesAllToOne
{
    @Test
    public void test1()
        throws IOException
    {
        String rootPath = "C:\\Users\\Administrator\\Desktop\\pics\\lxd";
        
        // 输入图片地址
        String[] imgs = {"C:\\Users\\Administrator\\Desktop\\pics\\lxd\\005.jpg", "C:\\Users\\Administrator\\Desktop\\pics\\lxd\\006.jpg"};
        
        new File(rootPath + "\\all\\").mkdirs();
        
        // 调用方法生成图片
        merge(imgs, "jpg", rootPath + "\\all\\" + System.currentTimeMillis() + ".jpg");
        if (SystemUtils.IS_OS_WINDOWS)
        {
            // 打开目录
            Runtime.getRuntime().exec("cmd /c start " + rootPath);
        }
    }
    
    @Test
    public void test2()
        throws IOException
    {
        String rootPath = "C:\\Users\\Administrator\\Desktop\\pics\\lxd";
        File file = new File(rootPath);
        Collection<File> pics = FileUtils.listFiles(file, new String[] {"jpg"}, false);
        List<String> paths = new ArrayList<>();
        for (File pic : pics)
        {
            paths.add(pic.getCanonicalPath());
        }
        
        // 输入图片地址
        String[] imgs = paths.toArray(new String[] {});
        
        new File(rootPath + "\\all\\").mkdirs();
        
        // 调用方法生成图片
        merge(imgs, "jpg", rootPath + "\\all\\" + System.currentTimeMillis() + ".jpg");
        if (SystemUtils.IS_OS_WINDOWS)
        {
            // 打开目录
            Runtime.getRuntime().exec("cmd /c start " + rootPath);
        }
    }
    
    @Test
    public void test3()
        throws IOException
    {
        String rootPath = "C:\\Users\\Administrator\\Desktop\\pics\\mpp";
        File file = new File(rootPath);
        Collection<File> pics = FileUtils.listFiles(file, new String[] {"jpg"}, false);
        List<String> paths = new ArrayList<>();
        for (File pic : pics)
        {
            paths.add(pic.getCanonicalPath());
        }
        
        // 输入图片地址
        String[] imgs = paths.toArray(new String[] {});
        
        new File(rootPath + "\\all\\").mkdirs();
        
        // 调用方法生成图片
        merge(imgs, "jpg", rootPath + "\\all\\" + System.currentTimeMillis() + ".jpg");
        if (SystemUtils.IS_OS_WINDOWS)
        {
            // 打开目录
            Runtime.getRuntime().exec("cmd /c start " + rootPath);
        }
    }
    
    /**
     * Java拼接多张图片
     * 
     * @param imgs
     * @param type
     * @param dst_pic
     * @return
     */
    public boolean merge(String[] imgs, String type, String dst_pic)
    {
        // 获取需要拼接的图片长度
        int len = imgs.length;
        // 判断长度是否大于0
        if (len < 1)
        {
            return false;
        }
        File[] src = new File[len];
        BufferedImage[] images = new BufferedImage[len];
        int[][] ImageArrays = new int[len][];
        for (int i = 0; i < len; i++)
        {
            try
            {
                src[i] = new File(imgs[i]);
                images[i] = ImageIO.read(src[i]);
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return false;
            }
            int width = images[i].getWidth();
            int height = images[i].getHeight();
            // 从图片中读取RGB 像素
            ImageArrays[i] = new int[width * height];
            ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width);
        }
        
        int dst_height = 0;
        int dst_width = images[0].getWidth();
        // 合成图片像素
        for (int i = 0; i < images.length; i++)
        {
            dst_width = dst_width > images[i].getWidth() ? dst_width : images[i].getWidth();
            dst_height += images[i].getHeight();
        }
        // 合成后的图片
        log.info("宽度:{} 高度:{}", dst_width, dst_height);
        if (dst_height < 1)
        {
            System.out.println("dst_height < 1");
            return false;
        }
        // 生成新图片
        try
        {
            // dst_width = images[0].getWidth();
            BufferedImage ImageNew = new BufferedImage(dst_width, dst_height, BufferedImage.TYPE_INT_RGB);
            int height_i = 0;
            for (int i = 0; i < images.length; i++)
            {
                ImageNew.setRGB(0, height_i, dst_width, images[i].getHeight(), ImageArrays[i], 0, dst_width);
                height_i += images[i].getHeight();
            }
            
            File outFile = new File(dst_pic);
            ImageIO.write(ImageNew, type, outFile);// 写图片 ，输出到硬盘
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}